#pragma once

#include "oal/pch.h"
#include "oal/WavFile.h"
#include "glm/glm.hpp"

namespace Oal
{

	struct Source {

		std::string m_Path;

		struct Config
		{
			glm::vec3 position;
			glm::vec3 velocity;
			glm::vec3 direction;
			float gain = 1.0f;
			int looping = false;
			float referenceDistance;
			float rollOffFactor;
			float maxDistance;

			float secOffset;
			int byteOffset;
			int sampleOffset;

		};

		unsigned int buffer;
		unsigned int source;

		Source(const std::string& path);

		void Create();
		void Play();
		void Pause();
		void Stop();

		void SetFloat(const int target, const float& v);
		void SetVec3(const int target, const glm::vec3& val);
		void SetInt(const int target, const int& v);


		void GetFloat(const int target, float& v);
		void GetVec3(const int target, glm::vec3& val);
		void GetInt(const int target, int& v);


		void SetPosition(const glm::vec3& val);
		void GetPosition(glm::vec3& val);

		void SetVelocity(const glm::vec3& val);
		void GetVelocity(glm::vec3& val);

		void SetDirection(const glm::vec3& val);
		void GetDirection(glm::vec3& val);

		void SetGain(const float& v);
		void GetGain(float& v);

		void SetLooping(const int& v);
		void GetLooping(int& v);

		void SetReferenceDistance(const float& v);
		void GetReferenceDistance(float& v);

		void SetRollOffFactor(const float& v);
		void GetRollOffFactor(float& v);

		void SetMaxDistance(const float& v);
		void GetMaxDistance(float& v);

		void SetSecOffset(const float& v);
		void GetSecOffset(float& v);


		void SetSampleOffset(const int& v);
		void GetSampleOffset(int& v);

		void SetByteOffset(const int& v);
		void GetByteOffset(int& v);


		int GetState();

		void Destory();

		void GetConfig(Config& config);

		void SetConfig(const Config& config);

		virtual ~Source();
		
	};
};